
import torque.generated.Cases;
import torque.generated.CasesPeer;
import torque.generated.Partie;
import torque.generated.PartiePeer;
import torque.generated.Player;
import torque.generated.PlayerPeer;
import torque.generated.Vaisseau;
import torque.generated.VaisseauPeer;
import torque.generated.map.VaisseauMapBuilder;
import java.lang.Math;
import java.util.ArrayList;
import java.util.List;

import org.apache.torque.Torque;
import org.apache.torque.TorqueException;

public class menu {
	
	public final static String TORQUE_PROPS = new String(
			"torque-3.3//Torque.properties");
	
	
	
//	public enum direction {haut,bas,gauche,droite}
	public static void main(String Args[]) throws Exception {
		Torque.init(TORQUE_PROPS);
		new menu();
	}
	
	public menu() throws Exception {
	int choix;
	do {
		System.out.println();
		System.out.println("      **************************************");
		System.out.println("      *          Star Wars                 *");
		System.out.println("      **************************************");
		System.out.println("      * 1 - Nouvelle Partie                *");
		System.out.println("      * 2 - Charger une Partie             *");
		System.out.println("      * 3 - Supprimer une Partie           *");
		System.out.println("      *                                    *");
		System.out.println("      * 0- Quitter                         *");
		System.out.println("      **************************************");
		System.out.println();
		System.out.print("      Votre Choix : ");
		choix = IO.lireEntier();
		switch (choix) {
		case 1: {
			menu.nouvellePartie();
			break;
		}
		case 2: {
			menu.chargerPartie();
			break;
		}
		case 3: {
			menu.supprimerPartie();
			break;
		}
		case 4: {
			break;
		}
		default:
			break;
		}

		System.out.println();
	} while (choix != 0);
	

}
	public static void nouvellePartie() throws Exception{
		String player1,player2,nomPartie;
		int taille;
		System.out.println("choisissez un nom pour la partie");
		nomPartie = IO.lireChaine();
		System.out.println("choisissez un nom de joueur pour le player1");
		player1 = IO.lireChaine();
		System.out.println("choisissez un nom de joueur pour le player2");
		player2 = IO.lireChaine();
		System.out.println("choisissez une taille d'echiquier (AxA)");
		taille = IO.lireEntier();		
		Partie partie = PartiePeer.nouvellePartie(nomPartie,taille);
		
		int choix;
		String vaisseau1 = null,vaisseau2 = null;
		for(int i=0;i<2;i++){
			do {
				System.out.println();
				System.out.println("      **************************************");
				System.out.println("      *          Star Wars                 *");
				System.out.println("      *    Choix du vaisseau du joueur "+(i+1)+"   *");
				System.out.println("      **************************************");
				System.out.println("      * 1 - Choisir un vaisseau            *");
				System.out.println("      * 2 - Creer un vaisseau              *");
				System.out.println("      *                                    *");
				System.out.println("      * 0- Quitter                         *");
				System.out.println("      **************************************");
				System.out.println();
				System.out.print("      Votre Choix : ");
				choix = IO.lireEntier();
		
				switch (choix) {
				case 1: {
					if(i==0){
						vaisseau1 = menu.choixVaisseau();
					}else{
						vaisseau2 = menu.choixVaisseau();
					}
					break;
				}
				case 2: {
					if(i==0){
						vaisseau1 = menu.creerVaisseau();
					}else{					
						vaisseau2 = menu.creerVaisseau();
					}
					break;
				}
				default:
					break;
				}
	
				System.out.println();
			} while (choix != 0);
		}
		Vaisseau v1 = VaisseauPeer.getV(vaisseau1);
		Vaisseau v2 = VaisseauPeer.getV(vaisseau2);
		
		Player p1 = new Player(player1,v1,v1.getEnergie());
		Player p2 = new Player(player2,v2,v2.getEnergie());
		
		partie.setJoueur(p1, 1);
		partie.setJoueur(p2, 2);
				
		Cases cases1 = new Cases(partie,0,0);
		Cases cases2 = new Cases(partie,taille,taille);
		int numR;
		numR = random12();
		if(numR==1){
			cases1.addV(v1);
			cases2.addV(v2);
		}else{
			cases1.addV(v2);
			cases2.addV(v1);
		}
		//TODO créer une fonction qui place random des objets sur la carte 
		menu.lancerPartie(partie);
		
		
	}
	public static void chargerPartie() throws Exception{
		List<Partie> pList= PartiePeer.doSelectAll();
		for(Partie partie : pList){
			partie.getNom();
		}
		String nomP ;
		System.out.println("choisissez une partie à charger");
		nomP = IO.lireChaine();
		menu.lancerPartie(PartiePeer.getP(nomP));
	}

	public static void supprimerPartie() throws Exception{
		List<Partie> pList= PartiePeer.doSelectAll();
		for(Partie partie : pList){
			partie.getNom();
		}
		String nomP ;
		System.out.println("choisissez une partie à supprimer");
		nomP = IO.lireChaine();
		PartiePeer.deleteP(nomP);
		
	}
	public static String choixVaisseau() throws Exception{

		List<Vaisseau> vList= VaisseauPeer.doSelectAll();
		for(Vaisseau vaisseau : vList){
			vaisseau.getNom();
		}
		String nomV;
		System.out.println("choisissez le nom d'un vaisseau");
		nomV = IO.lireChaine();
		return(nomV);
	}
	public static String creerVaisseau() throws Exception{
		String nomV;
		int attaque,degats,cdf,energie,somme;
		boolean existe = false;
		do{
		System.out.println("choisissez un nom de vaisseau");
		nomV = IO.lireChaine();
		existe = VaisseauPeer.exist(nomV);
		}while(!existe);
		
		do{
			System.out.println("vous allez devoir saisir les caractéristiques du vaisseau dont la somme doit être égale à 40");
			do{
				System.out.println("valeur pour l'attaque");
				attaque = IO.lireEntier();
			}while(attaque<0 && attaque>40);
			do{
				System.out.println("valeur pour les dégats");
				degats = IO.lireEntier();
			}while(degats<0 && degats>40);
			do{		
				System.out.println("valeur pour le champ de force");
				cdf = IO.lireEntier();
			}while(cdf<0 && cdf>40);
			do{			
				System.out.println("valeur pour l'energie");
				energie = IO.lireEntier();
			}while(energie<0 && energie>40);
			
			somme = attaque+degats+cdf+energie;
			
		}while(somme!=40);// 40 a passer en parametre plus tard
		energie = energie*10;
		@SuppressWarnings("unused")
		Vaisseau v1 = new Vaisseau(nomV, attaque, degats, cdf, energie);
		
		return(nomV);
	}
	public static void supprimerVaisseau() throws Exception{
		String nomV;
		System.out.println("choisissez un nom de vaisseau à supprimer");
		nomV = IO.lireChaine();
		VaisseauPeer.deleteV(nomV);
	}
	public static int random12(){
		int max,mini;		
		max=2;		
		mini=1;	
		return((int)(Math.random()*( max - mini + 1 )) + mini);
	}
	public static void lancerPartie(Partie partie) throws Exception{
		boolean endGame=false;
		boolean endTurn=false;
		int choix;
		int numP;
		numP = random12();
		int pa = 0;
		do{
			do{
			
				Player p = PlayerPeer.rechPlayer(numP, partie);
				System.out.println();
				System.out.println("      **************************************");
				System.out.println("      *          Star Wars                 *");
				System.out.println("      *    Tour  du vaisseau du joueur "+numP+"   *");
				System.out.println("      **************************************");
				System.out.println("      * 1 - Deplacement                    *");
				System.out.println("      * 2 - Attaque                        *");
				System.out.println("      * 3 - Intercepter                    *");
				System.out.println("      * 4 - Utiliser                       *");
				System.out.println("      * 5 - Equiper                        *");
				System.out.println("      * 6 - Passer son tour                *");
				System.out.println("      *                                    *");		
				System.out.println("      * 0- Quitter                         *");
				System.out.println("      **************************************");
				System.out.println();
				System.out.print("      Votre Choix : ");
				choix = IO.lireEntier();
		
				switch (choix) {
				case 1: {
					deplacement(p, numP,partie);
					break;
				}
				case 2: {
					
					break;
				}
				case 3: {
					
					break;
				}
				case 4: {
					
					break;
				}	
				case 5: {
					
					break;
				}
				case 6: {
					endTurn = true;
					break;
				}	
				default:
					endGame=true;
					break;
				}
				if(pa==0){
					endTurn=true;
				}
			}while(!endTurn);
			
			if(numP==1){
				numP=2;
			}
			else{
				numP=1;
			}
			
			
		}while(!endGame);
	}

	private static void deplacement(Player p,int numP, Partie part) throws  Exception {
		int choix;
		Cases position = p.getVaisseau().position();
		System.out.println();
		System.out.println("      **************************************");
		System.out.println("      *          Star Wars                 *");
		System.out.println("      *    Tour  du vaisseau du joueur "+numP+"   *");
		System.out.println("      *             DEPLACEMENT            *");
		System.out.println("      **************************************");
		System.out.println("      * 1 - Haut                           *");
		System.out.println("      * 2 - Bas                            *");
		System.out.println("      * 3 - Gauche                         *");
		System.out.println("      * 4 - Droite                         *");
		System.out.println("      *                                    *");		
		System.out.println("      * 0- Retour                          *");
		System.out.println("      **************************************");
		System.out.println();
		System.out.print("      Votre Choix : ");
		choix = IO.lireEntier();
		
		switch(choix) {
		//TODO catcher les exceptions !!!
		case 1: {
			if(checkDep("Haut",position,part)){
				CasesPeer.getCase(part, position.getX(), position.getY()-1);
			}else{
				System.out.println("Deplacement impossible");
			}
			
			break;
		}
		case 2:{
			if(checkDep("Bas",position,part)){
				CasesPeer.getCase(part, position.getX(), position.getY()+1);
			}else{
				System.out.println("Deplacement impossible");
			}
			break;
		}
		case 3: {
			if(checkDep("Gauche",position,part)){
				CasesPeer.getCase(part, position.getX()-1, position.getY());
			}else{
				System.out.println("Deplacement impossible");
			}
			break;
		}
		case 4: {
			if(checkDep("Droite",position,part)){
				CasesPeer.getCase(part, position.getX()+1, position.getY());
			}else{
				System.out.println("Deplacement impossible");
			}			
			break;
		}
		case 0: {

			break;
		}
		default: {
			
			break;
		}
	    }
	}
	
	private static boolean checkDep(String dir,Cases c,Partie p){
		if(dir=="Haut"){
			return(!(c.getY()-1<0));	
		}else if(dir=="Bas"){
			return(!(c.getY()+1>p.getTaille()-1));	
		}else if(dir=="Gauche"){
			return(!(c.getX()-1<0));
		}else if(dir=="Droite"){
			return(!(c.getX()+1>p.getTaille()-1));	
		}else{
			return(false);
		}
		
	}
}
